﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lesson22File
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 文件操作 引用 System.IO
            // 知识点：1、通过FileInfo和DirectoryInfo类来读取文件和文件夹属性
            //           查看文件属性、创建文件、移动文件、重命名文件，判断路径是否存在、创建目录
            // 2、通过File读写文件
            // 3、使用流来读写文件
            //    FileStream、StreamReader(读取流)、StreamWriter（写入流）

            //FileInfo txtFile = new FileInfo(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt");
            // 复制一个文件
            //txtFile.CopyTo(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFileCopy.txt");

            // 通过File的静态方法来复制  File是一个静态类
            // Copy("源路径", "目标路径")
            //File.Copy(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt", 
            //    @"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFileCopy2.txt");

            DirectoryInfo dir = new DirectoryInfo(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\create");
            //dir.Create(); // 创建目录
            Console.WriteLine(dir.Exists); // Exists 是属性 判断目录是否存在

            // Directory是一个静态类，提供了一些静态方法来操作目录
            //Directory.Exists(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\create"); // 判断目录是否存在

            // 完整路径==绝对路径     相对路径

            /*
             FileInfo和DirectoryInfo 的部分属性列表
                CreateTime    创建文件或文件夹的时间
                DirectoryName（用于FileInfo） 包含文件夹的完整路径
                Parent（用于DirectoryInfo）   指定子目录的父目录
                Exists    判断文件或文件夹是否存在
                Extension    文件扩展名,文件夹没有（返回空）
                FullName    文件或文件夹的完整路径
                LastAccessTime    上次(最后一次)访问文件或文件夹的时间
                LastWriteTime    上次(最后一次)修改文件或文件夹的时间
                Name    文件或文件夹的名称
                Root（仅用于DirectoryInfo）    路径的根部分   根目录
                Length （仅用于FileInfo）    文件的大小（字节数） 

            FileInfo和DirectoryInfo 的部分方法列表
                Create()    创建给定名称的文件夹或空文件，对于FileInfo,该方法会返回一个流对象，以便于写入文件
                Delete()    删除文件或文件夹，对于文件夹有一个可以递归的Delete(bool)选项
                MoveTo()    移动或重命名文件或文件夹
                CopyTo()    只用于FileInfo 复制文件, 文件夹没有复制方法，复制文件夹需要递归复制目录树
                GetDirectories()    只用于DirectoryInfo  返回DirectoryInfo对象数组，该数组包含当前目录中的所有子目录
                GetFiles()    只用于DirectoryInfo 返回FileInfo对象数组，该数组包含当前目录中的所有文件
                GetFileSystemInfos()    只用于DirectoryInfo 返回FileInfo对象数组和DirectoryInfo对象数组，该数组包含当前目录中的所有文件和子目录
                                        它把文件夹中所有对象表示为一个FileSystemInfo对象

             */

            // Path类
            // Path类不能实例化， Path类提供了一些静态方法，可以更容易对路径名执行操作，可以跨系统使用
            //Console.Write(Path.Combine(@"F:\practise", "Readme.txt"));

            // 读取文件
            // 通过File类读写文件
            // 读取
            // 1、File.ReadAllText(FilePath[, Encoding]) 根据文件路径读取文件中所有文本, 可以指定编码格式 Encoding.ASCII
            string text = File.ReadAllText(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt", Encoding.UTF8);
            Console.WriteLine(text);

            // 2、File.ReadAllLines()  以行的形式读取文件，一行一个字符串，返回一个字符串的数组
            string[] conArray = File.ReadAllLines(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt");
            foreach (string con in conArray)
            {
                Console.WriteLine(con);
            }

            // 3、File.ReadAllBytes()  可以打开二进制文件，读取内容，返回一个字节数组  不建议使用，会先将内容读取到内存中




            // 写入文件
            //File.WriteAllText(FilePath, content)
            //File.WriteAllText(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt", "File.WriteAllText文件写入");

            //File.WriteAllLines(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt", 
            //    new string[] { "\"File.WriteAllText文件写入\"", "\"File.ReadAllText读取写入\"" });

            // File.WriteAllBytes();


            // 流是一种数据的处理方法
            // 为什么使用流处理数据？数据小，可以一次搬运，数据大，可以把数据当做流水一点点搬运
            // 流媒体

            // 读写内存使用System.IO.MemorySystem
            // 处理网络数据使用System.Net.Sockets.NetworkStream

            // 流相关方法
            // new FileStream(FilePath, FileMode, FileAccess, FileShare); // 后面三个参数是 文件打开方式和文件访问权限和指定文件的共享模式
            // FileMode:
            //      CreateNew（创建新文件，如果已存在则抛出异常）、
            //      Create（创建新文件，如果已存在则覆盖）、
            //      Open（打开文件，不存在则抛异常）、
            //      OpenOrCreate（打开或者新建文件夹，存在则打开，指针定位到开始，不存在则新建）、
            //      Truncate（文件存在，则打开文件，清除文件中的内容，指针定位到开始，保留最初文件的创建日期，文件不存在则抛出异常）、
            //      Append（追加，文件存在则打开，指定定位到结尾，文件不存在，则新建文件）
            // FileAccess:Read（只读）、Write（只写）、ReadOrWrite（读写）  
            // FileShare:  
            //      None（不允许其他进程或线程操作）、
            //      Read（允许其他进程或线程以只读模式打开）、
            //      Write （允许其他进程或线程以只写模式打开）、
            //      ReadWrite （允许其他进程或线程以读写模式打开）、
            //      Delete （允许其他进程或线程删除该文件）
            // 文件流
            //FileStream readStream = new FileStream(@"F:\药育GMP\client.zip", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
            //FileStream readStream = new FileStream(@"F:\药育GMP\client.zip", FileMode.Open);
            FileStream readStream = new FileStream(@"F:\药育GMP\client.zip", FileMode.Open, FileAccess.ReadWrite);
            //readStream.ReadByte();  // 按字节读取

            FileStream writeStram = new FileStream(@"F:\药育GMP\clientCopy.zip", FileMode.Create, FileAccess.Write);
            //writeStram.WriteByte();  // 按字节写入

            //int nextByte = -1;
            //while ((nextByte=readStream.ReadByte())!= -1)
            //{
            //    writeStram.WriteByte((byte)nextByte);
            //}


            byte[] buffer = new byte[1024];
            //readStream.Read(buffer, 0, buffer.Length)  // 一次读取多个字节
            //writeStram.Write(buffer, 0, buffer.Length)  // 一次写入多个字节
            int count = -1;
            while ((count = readStream.Read(buffer, 0, buffer.Length)) != 0)  // Read的读不到的返回值是 0
            {
                writeStram.Write(buffer, 0, count);
            }
            // 使用完要关闭
            readStream.Close();
            writeStram.Close();


            // 文本读取流
            StreamReader reader = new StreamReader(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt", Encoding.UTF8);

            // 第二种方式
            //FileStream fs = new FileStream(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt", FileMode.Open);
            //StreamReader fsRead = new StreamReader(fs, Encoding.UTF8);

            // 文本读取流 第三种
            //FileInfo myFile = new FileInfo(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFile1.txt");
            //myFile.OpenText();

            string line = reader.ReadLine();  // 读取一行
            Console.WriteLine(line);

            //string nextLine = null;
            //while((nextLine = reader.ReadLine()) != null)
            //{
            //    Console.WriteLine(nextLine);
            //}

            //reader.ReadToEnd(); // 从指针位置读到最后


            //reader.Read();    // 读取一个字符

            //char[] charBuffer = new char[1024];
            //reader.Read(charBuffer, 0, charBuffer.Length);  // 一次读多个字符

            //StreamWriter writer = new StreamWriter(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFileStreamWrite.txt");
            // 传入第二个参数为true  表示追加写入
            StreamWriter writer = new StreamWriter(@"F:\cSharpUnityPractice\cSharp\source\repos\Project\Lesson22File\TextFileStreamWrite.txt", true);

            //string nextCharLine = null;
            //while ((nextCharLine = reader.ReadLine()) != null)
            //{
            //    writer.WriteLine(nextCharLine);
            //}

            char[] buffers = new char[1024];
            int counts = -1;
            while ((counts = reader.Read(buffers, 0, buffers.Length)) != 0)
            {
                writer.Write(buffers, 0, buffers.Length);
            }



            writer.Flush();  // 刷新

            reader.Close();
            writer.Close();



        }
    }
}
